/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "几何计算.h"


float32 f_graph_两线段距离(const vec3& vec0, const vec3& vec1, const vec3& line起点, const vec3& line方向单位向量) {
	vec3 线段1的第1个顶点_to_线段2第一个顶点_单位向量 = vec_normalize2(vec0 - line起点);
	vec3 线段1的第2个顶点_to_线段2第一个顶点_单位向量 = vec_normalize2(vec1 - line起点);

	vec3 中点 = (vec1 - vec0) * 0.5f + vec0;

	vec3 中点线方向 = vec_normalize2(line起点 - 中点);
	float32 中点点积1 = fabs(vec_dot(线段1的第1个顶点_to_线段2第一个顶点_单位向量, 中点线方向));
	float32 中点点积2 = fabs(vec_dot(line方向单位向量, 中点线方向));

	if (中点点积2 > 中点点积1) {
		vec3 新顶点 = vec0 + line方向单位向量;
		return fabs(f_graph_点到三角形平面距离({ vec0 , vec1 , 新顶点 }, line起点));
	}
	return -1;
}

float32 f_graph_两线段距离(const vec3& vec0, const vec3& vec1, const vec3& line起点, const vec3& line方向单位向量, vec3& 相交点, float32 线段补偿距离) {
	vec3 线段 = (vec1 - vec0);
	vec3 线段长度补偿 = normalize(线段) * 线段补偿距离;


	vec3 线段1的第1个顶点_to_线段2第一个顶点_单位向量 = vec_normalize2(vec0 - 线段长度补偿 - line起点);
	vec3 线段1的第2个顶点_to_线段2第一个顶点_单位向量 = vec_normalize2(vec1 + 线段长度补偿 - line起点);

	

	float32 线段长度一半 = vec_len(线段) * 0.5;
	vec3 中点 = 线段 * 0.5f + (vec0);

	vec3 中点线方向 = vec_normalize2(line起点 - 中点);
	float32 中点点积1 = fabs(vec_dot(线段1的第1个顶点_to_线段2第一个顶点_单位向量, 中点线方向));
	float32 中点点积2 = fabs(vec_dot(line方向单位向量, 中点线方向));

	if (中点点积2 > 中点点积1) {
		vec3 新顶点 = vec0 + line方向单位向量;
		float32 距离 = fabs(f_graph_点到三角形平面距离({ vec0 , vec1 , 新顶点 }, line起点));


		float32 d1 = vec_dot(线段1的第1个顶点_to_线段2第一个顶点_单位向量, line方向单位向量);
		float32 d2 = vec_dot(线段1的第2个顶点_to_线段2第一个顶点_单位向量, line方向单位向量);
		if (d1 > 0 && d2 > 0) {
			float32 射线向量偏移占比 = (d2 / d1) * 线段长度一半;
			相交点 = vec0 + vec_normalize(线段) * 射线向量偏移占比;
		}
		
		return 距离;
	}

	return -1;
}



vec3 f_graph_从向量计算旋转角(const vec3& 向量1, const vec3& 向量2) {
	vec3 v = 向量2 - 向量1;
	vec3 x = vec_normalize(v * vec3{ 1,0,0 });
	vec3 y = vec_normalize(v * vec3{ 0,1,0 });
	vec3 z = vec_normalize(v * vec3{ 0,0,1 });

	vec3 角度;
	角度.x = f_graph_两向量夹角弧度(x, vec3{ 0,0,1 });
	角度.y = f_graph_两向量夹角弧度(y, vec3{ 1,0,0 });
	角度.z = f_graph_两向量夹角弧度(z, vec3{ 0,1,0 });
	return 角度;
}



float32 f_graph_两向量夹角弧度_export(const vec3& vec0, const vec3& vec1) {
	float32 角A = fabs(vec_dot(vec0, vec1));
	float32 角B = vec_len(vec0) * vec_len(vec1);
	return acos(角A / (角B + DEF_浮点精度补充));
}
